package org.example.exampreparationtreasure.service;

import org.example.exampreparationtreasure.model.entity.ExamPaperConfig;
import org.example.exampreparationtreasure.model.entity.PracticeMode;
import org.example.exampreparationtreasure.model.entity.Question;
import org.example.exampreparationtreasure.model.entity.Answer;
import org.example.exampreparationtreasure.model.entity.ExamRecord;

import java.util.List;
import java.util.Map;

/**
 * 练习模式服务接口
 */
public interface PracticeModeService {

    /**
     * 根据配置选择题目
     * @param config 试卷配置
     * @param userId 用户ID
     * @return 选中的题目列表
     */

    List<Question> selectQuestions(ExamPaperConfig config, Long userId);

    /**
     * 开始考试 - 创建考试记录
     * @param config 试卷配置
     * @param userId 用户ID
     * @param questions 题目列表
     * @return 考试记录ID
     */
    Long startExam(ExamPaperConfig config, Long userId, List<Question> questions);

    /**
     * 保存完整试卷数据并开始考试
     * @param config 试卷配置
     * @param userId 用户ID
     * @param questions 题目列表
     * @return 考试记录ID
     */
    Long savePaperAndStartExam(ExamPaperConfig config, Long userId, List<Question> questions);

    /**
     * 提交考试 - 批改所有答案并计算成绩
     * @param examRecordId 考试记录ID
     * @param userId 用户ID
     * @param answers 所有答案（包含题目ID和用户答案）
     * @param examDuration 考试总用时（分钟）
     * @return 考试结果
     */
    Map<String, Object> submitExam(Long examRecordId, Long userId, List<Map<String, Object>> answers, Integer examDuration);

    /**
     * 自动判断答案是否正确
     * @param question 题目
     * @param userAnswer 用户答案
     * @return 是否正确
     */
    Boolean judgeAnswer(Question question, Map<String, Object> userAnswer);

    /**
     * 计算题目得分
     * @param question 题目
     * @param isCorrect 是否答对
     * @return 得分
     */
    Double calculateScore(Question question, Boolean isCorrect);

    /**
     * 获取考试结果
     * @param examRecordId 考试记录ID
     * @param userId 用户ID
     * @return 考试结果详情
     */
    Map<String, Object> getExamResult(Long examRecordId, Long userId);

    /**
     * 获取用户考试历史记录
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @param practiceMode 练习模式（可选）
     * @return 考试历史记录
     */
    Map<String, Object> getExamHistory(Long userId, Integer page, Integer size, String practiceMode);
}
